package com.camemax.amqp.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/*
***************************
*   @Date: 2021-06-12
*   @Author: Camemax
*   @Description: Configuration could configure the rabbitmq's exchanges and queues and bindings.
***************************
*/
@Configuration
public class RabbitmqConfiguration {
    // test publisher in fanout mode :
    // one exchange : spring-boot-fanout-exchange
    // three queue to consume: message、wechat、email
    // three bindings.
    static class FanoutEnvironment {
        @Bean
        FanoutExchange declareFanoutExchange() {
            return new FanoutExchange("spring-boot-fanout-exchange",
                    true,
                    false,
                    null
            );
        }

        @Bean
        Queue declareMessageQueue() {
            return new Queue("message-queue",
                    true,
                    false,
                    false,
                    null
            );
        }

        @Bean
        Queue declareWechatQueue() {
            return new Queue("wechat-queue",
                    true,
                    false,
                    false,
                    null
            );
        }

        @Bean
        Queue declareEmailQueue() {
            return new Queue("email-queue",
                    true,
                    false,
                    false,
                    null
            );
        }

        @Bean
        Binding declareMessageBindings() {
            return BindingBuilder.bind(declareMessageQueue()).to(declareFanoutExchange());
        }

        @Bean
        Binding declareWechatBindings() {
            return BindingBuilder.bind(declareWechatQueue()).to(declareFanoutExchange());
        }

        @Bean
        Binding declareEmailBindings() {
            return BindingBuilder.bind(declareEmailQueue()).to(declareFanoutExchange());
        }
    }

    // test publisher in direct mode :
    // one exchange : spring-boot-direct-exchange
    // three queue to consume: message、wechat、email
    // three bindings.
//    static class DirectEnvironment {
//        // Declare Direct Exchange
//        @Bean
//        public DirectExchange declareDirectExchange(){
//            return new DirectExchange(
//                    "spring-boot-direct-exchange",
//                    true,
//                    false,
//                    null
//            );
//        }
//
//        // Declare Direct Queue
//        @Bean
//        public Queue declarePassQueue(){
//            return new Queue(
//                    "pass-score-queue",
//                    true,
//                    false,
//                    false,
//                    null
//            );
//        }
//        @Bean
//        public Queue declareFailQueue(){
//            return new Queue(
//                    "fail-score-queue",
//                    true,
//                    false,
//                    false,
//                    null
//            );
//        }
//        @Bean
//        public Queue declareGoodQueue(){
//            return new Queue(
//                    "good-score-queue",
//                    true,
//                    false,
//                    false,
//                    null
//            );
//        }
//
//        // Declare Direct Bindings
//        @Bean
//        public Binding declareFailBindings(){
//            return BindingBuilder.bind(declareFailQueue()).to(declareDirectExchange()).with("fail");
//        }
//        @Bean
//        public Binding declarePassBindings(){
//            return BindingBuilder.bind(declarePassQueue()).to(declareDirectExchange()).with("pass");
//        }
//        @Bean
//        public Binding declareGoodBindings(){
//            return BindingBuilder.bind(declareGoodQueue()).to(declareDirectExchange()).with("good");
//        }
//    }

    // test publisher in direct mode :
    // one exchange : spring-boot-direct-exchange
    // three queue to consume: message、wechat、email
    // three bindings.
//    static class TopicEnvironment {
//        // Declare Topic Exchange
//        @Bean
//        public TopicExchange declareTopicExchange(){
//            return new TopicExchange(
//                    "spring-boot-topic-exchange",
//                    true,
//                    false,
//                    null
//            );
//        }
//
//        // Declare Topic Queues
//        @Bean
//        public Queue declareComQueue(){
//            return new Queue(
//                    "com-queue",
//                    true,
//                    false,
//                    false,
//                    null
//            );
//        }
//        @Bean
//        public Queue declareStudentsQueue(){
//            return new Queue(
//                    "students-queue",
//                    true,
//                    false,
//                    false,
//                    null
//            );
//        }
//        @Bean
//        public Queue declareNameQueue(){
//            return new Queue(
//                    "name-queue",
//                    true,
//                    false,
//                    false,
//                    null
//            );
//        }
//        @Bean
//        public Queue declareTestQueue(){
//            return new Queue(
//                    "test-queue",
//                    true,
//                    false,
//                    false,
//                    null
//            );
//        }
//        // Declare Topic Bindings
//        @Bean
//        public Binding declareComBindings(){
//            return BindingBuilder
//                    .bind(declareComQueue())
//                    .to(declareTopicExchange())
//                    .with("com.#");
//        }
//        @Bean
//        public Binding declareStudentsBindings(){
//            return BindingBuilder
//                    .bind(declareStudentsQueue())
//                    .to(declareTopicExchange())
//                    .with("#.students.#");
//        }
//        @Bean
//        public Binding declareNameBindings(){
//            return BindingBuilder
//                    .bind(declareNameQueue())
//                    .to(declareTopicExchange())
//                    .with("#.name.*");
//        }
//        @Bean
//        public Binding declareTestBindings(){
//            return BindingBuilder
//                    .bind(declareTestQueue())
//                    .to(declareTopicExchange())
//                    .with("#.test.*");
//        }
//    }

    // test publisher in direct mode :
    // one exchange : spring-boot-direct-exchange
    // three queue to consume: message、wechat、email
    // three bindings.
//    static class HeadersEnvironment {
//        // Declare Headers Exchange
//        @Bean
//        public HeadersExchange declareHeadersExchange(){
//            return new HeadersExchange(
//                    "spring-boot-headers-exchange",
//                    true,
//                    false,
//                    null
//            );
//        }
//
//        // Declare Headers Queues
//        @Bean
//        public Queue declareIdQueue(){
//            Map<String, Object> idMap = new HashMap<>();
//            idMap.put("id", "id001");
//            return new Queue(
//                    "id-queue",
//                    true,
//                    false,
//                    false,
//                    idMap
//            );
//        }
//        @Bean
//        public Queue declareCoffeeQueue(){
//            Map<String, Object> coffeeMap = new HashMap<>();
//            coffeeMap.put("coffee", "latte");
//            return new Queue(
//                    "coffee-queue",
//                    true,
//                    false,
//                    false,
//                    coffeeMap
//            );
//        }
//
//        // Declare Headers Bindings
//        @Bean
//        public Binding declareIdBindings(){
//            return BindingBuilder
//                    .bind(declareIdQueue())
//                    .to(declareHeadersExchange())
//                    .where("id")
//                    .matches("id001");
//        }
//        @Bean
//        public Binding declareCoffeeBindings(){
//            return BindingBuilder
//                    .bind(declareCoffeeQueue())
//                    .to(declareHeadersExchange())
//                    .where("coffee")
//                    .matches("latte");
//        }
//    }

    // test publisher in TTL, whatever modes.
//    static class TTLEnvironment {
//        private static final Map<String , Object> TTLMAP = new HashMap<>();
//        @Bean
//        public Queue TTLQueue(){
//            TTLMAP.put("x-message-ttl",3000);
//            return new Queue(
//                    "TTL-queue-java",
//                    true,
//                    false,
//                    false,
//                    TTLMAP
//            );
//        }
//    }

//    // test Dead Letter in direct mode.
//    static class DLXEnvironment {
//        private static final Map<String, Object> DLXMAP = new HashMap<>();
//
//        // Declare Direct Exchange
//        @Bean
//        public DirectExchange declareDirectExchange(){
//            return new DirectExchange(
//                    "direct-exchange-java",
//                    true,
//                    false,
//                    null
//            );
//        }
//        @Bean
//        public DirectExchange declareDLXExchange(){
//            return new DirectExchange(
//                    "dlx-exchange-java",
//                    true,
//                    false,
//                    null
//            );
//        }
//
//        // Declare Direct TTL Queues
//        @Bean
//        public Queue declareDirectQueue(){
//            DLXMAP.put("x-message-ttl", 3000);
//            DLXMAP.put("x-dead-letter-exchange", "dlx-exchange-java");
//            DLXMAP.put("x-dead-letter-routing-key","dlx-rk-java");
//            return new Queue(
//                    "direct-ttl-queue-java",
//                    true,
//                    false,
//                    false,
//                    DLXMAP
//            );
//        }
//        @Bean
//        public Queue declareDLXQueue(){
//            return new Queue(
//                "dlx-queue-java",
//                    true,
//                    false,
//                    false,
//                    null
//            );
//        }
//
//        // Declare Direct Bindings
//        @Bean
//        public Binding declareDirectBindings(){
//            return BindingBuilder.bind(declareDirectQueue()).to(declareDirectExchange()).with("direct-rk");
//        }
//        @Bean
//        public Binding declareDLXBindings(){
//            return BindingBuilder.bind(declareDLXQueue()).to(declareDLXExchange()).with("dlx-rk-java");
//        }
//    }
}
